x86/nmi: self_nmi() should not unconditionally enable interrupts
authorAndrew Cooper <andrew.cooper3@citrix.com>
Thu, 15 Nov 2012 09:54:38 +0000 (09:54 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Thu, 15 Nov 2012 09:54:38 +0000 (09:54 +0000)
It seems that all current callers have interrupts enabled, making the
code currently safe but dangerous.  Also, fix a trailing whitespace
issue.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Committed-by: Keir Fraser <keir@xen.org>
xen/arch/x86/nmi.c

index 6ee407f8b6228ba87d6843e57e066c3fd7e4080b..4fd6711e82e545cbb7eb7fec1cef29fca168afa1 100644 (file)
@@ -482,13 +482,14 @@ void nmi_watchdog_tick(struct cpu_user_regs * regs)
  * 8-3 and 8-4 in IA32 Reference Manual Volume 3. We send the IPI to
  * our own APIC ID explicitly which is valid.
  */
-void self_nmi(void) 
+void self_nmi(void)
 {
+    unsigned long flags;
     u32 id = get_apic_id();
-    local_irq_disable();
+    local_irq_save(flags);
     apic_wait_icr_idle();
     apic_icr_write(APIC_DM_NMI | APIC_DEST_PHYSICAL, id);
-    local_irq_enable();
+    local_irq_restore(flags);
 }
 
 static void do_nmi_trigger(unsigned char key)